//#include<iostream>
//#include<algorithm>
//#include<vector>
//#include<cstring>
//#include<set>
//using namespace std;
//const int N = 1e3 + 10;
//vector<int> hobby[N];
//set<int> vc[N];
//bool vis[N];
//int Count = 0;
//void dfs(int u)
//{
//	vis[u] = true;
//	Count += 1;
//	for (const auto& t : vc[u])
//	{
//		if (!vis[t])
//		{
//			dfs(t);
//		}
//	}
//}
//int main()
//{
//	memset(vis, 0, sizeof vis);
//	int n;
//	cin >> n;
//	for (int i=1;i<=n;i++)
//	{
//		int m;
//		cin >> m;
//		getchar();
//		while (m--)
//		{
//			int x;
//			cin >> x;
//			hobby[x].push_back(i);
//		}
//	}
//	for (int i = 1; i <= 1000; i++)
//	{
//		for (int j = 0; j < hobby[i].size(); j++)
//		{
//			for (int k = j + 1; k < hobby[i].size(); k++)
//			{
//				vc[hobby[i][j]].insert(hobby[i][k]);
//				vc[hobby[i][k]].insert(hobby[i][j]);
//			}
//		}
//	}
//	vector<int> ans;
//	for (int i = 1; i <= n; i++)
//	{
//		if (!vis[i])
//		{
//			Count = 0;
//			dfs(i);
//			ans.push_back(Count);
//		}
//	}
//	sort(ans.begin(), ans.end());
//	reverse(ans.begin(), ans.end());
//	cout << ans.size() << endl;
//	for (int i = 0; i < ans.size(); i++)
//	{
//		if (i) {
//			cout << " ";
//		}
//		cout << ans[i];
//	}
//	return 0;
//}

#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<set>
using namespace std;
const int N = 1e3 + 10;
vector<int> hobby[N];
int parent[N];
int cnt[N];
int find(int x)
{
	if (x != parent[x])
	{
		parent[x] = find(parent[x]);
	}
	return parent[x];
}
int main()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		parent[i] = i;
	}
	for (int i = 1; i <= n; i++)
	{
		int m;
		cin >> m;
		getchar();
		while (m--)
		{
			int x;
			cin >> x;
			hobby[x].push_back(i);
		}
	}
	for (int i = 1; i <= 1000; i++)
	{
		for (int j = 1; j < hobby[i].size(); j++)
		{
			int a = find(hobby[i][0]);
			int b = find(hobby[i][j]);
			if (a != b)
			{
				parent[b] = a;
			}
		}
	}
	int sum = 0;
	for (int i = 1; i <= n; i++)
	{
		if (!cnt[find(i)])
		{
			sum++;
		}
		cnt[find(i)]++;
	}
	sort(cnt + 1, cnt + 1 + n, [](int& a, int& b) {
		return a > b;
		});
	cout << sum << endl;
	cout << cnt[1];
	for (int i = 2; i <= sum; i++)
	{
		cout << " " << cnt[i];
	}
	return 0;
}